package com.css.bjdt_report.util;

import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Random;
import java.util.UUID;

/**
 * 工具类 - 公用
 */

public class CommonUtil {

	/**
	 * 随机获取UUID字符串(无中划线)
	 * 
	 * @return UUID字符串
	 */
	public static String getUUID() {
		String uuid = UUID.randomUUID().toString();
		return uuid.substring(0, 8) + uuid.substring(9, 13) + uuid.substring(14, 18) + uuid.substring(19, 23)
				+ uuid.substring(24);
	}

	/**
	 * 随机获取字符串
	 * 
	 * @param length
	 *            随机字符串长度
	 * 
	 * @return 随机字符串
	 */
	public static String getRandomString(int length) {
		if (length <= 0) {
			return "";
		}
		char[] randomChar = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
				'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm' };
		Random random = new Random();
		StringBuffer stringBuffer = new StringBuffer();
		for (int i = 0; i < length; i++) {
			stringBuffer.append(randomChar[Math.abs(random.nextInt()) % randomChar.length]);
		}
		return stringBuffer.toString();
	}

	/**
	 * 根据指定长度 分隔字符串
	 * 
	 * @param str
	 *            需要处理的字符串
	 * @param length
	 *            分隔长度
	 * 
	 * @return 字符串集合
	 */
	public static List<String> splitString(String str, int length) {
		List<String> list = new ArrayList<String>();
		for (int i = 0; i < str.length(); i += length) {
			int endIndex = i + length;
			if (endIndex <= str.length()) {
				list.add(str.substring(i, i + length));
			} else {
				list.add(str.substring(i, str.length() - 1));
			}
		}
		return list;
	}

	/**
	 * 将字符串List转化为字符串，以分隔符间隔.
	 * 
	 * @param list
	 *            需要处理的List.
	 *            
	 * @param separator
	 *            分隔符.
	 * 
	 * @return 转化后的字符串
	 */
	public static String toString(List<String> list, String separator) {
		StringBuffer stringBuffer = new StringBuffer();
		for (String str : list) {
			stringBuffer.append(separator + str);
		}
		stringBuffer.deleteCharAt(0);
		return stringBuffer.toString();
	}

	//将每一个字母都塞进MAP里，然后未来通过字母可以取得对应的列号
	public static String[] letterArray = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O",
			"P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

	/**
	 * 将字母转化成数字
	 * 
	 * @param letterStr 需要转化的字母.
	 */
	public static String letterToNum(String letterStr) {
		String letterStrNew = letterStr.toUpperCase();
		String[] letterArrayNew = letterStrNew.split("");
		BigDecimal bdNum = new BigDecimal(0);
		/*因为截完字符串之后，数组第一个是个空格，所以从数组第二个开始取，如果数组长度是2，说明就一个字母，直接进行转化就行，如果数组长度不是2，
		说明类似这种AB,AAB等，这就要找到数组的最后一位，然后对最后一位进行转换，再加上26*/
		if (letterArrayNew.length <= 2) {
			bdNum = bdNum.add(new BigDecimal(letterArrayNew[1].hashCode()).subtract(new BigDecimal(64)));
		} else {
			BigDecimal a = (new BigDecimal(letterArrayNew.length).subtract(new BigDecimal(2)))
					.multiply(new BigDecimal(26));
			String lastLetter = letterArrayNew[letterArrayNew.length - 1];
			bdNum = bdNum.add(new BigDecimal(lastLetter.hashCode()).subtract(new BigDecimal(64))).add(a);
		}
		return bdNum.toString();
	}

	/**
	 * 将数字转换成字母
	 * 
	 * @param numStr 需要转化的数字.
	 */
	public static String numToLetter(String numStr) {
		Integer num = Integer.parseInt(numStr);
		Integer a = new BigDecimal(num).divideToIntegralValue(new BigDecimal(26)).intValue();
		if (a > 0) {
			Integer b = new BigDecimal(num).subtract(new BigDecimal(26).multiply(new BigDecimal(a))).intValue();
			String letter = "";
			for (int c = 0; c < a; c++) {
				letter += "A";
			}
			letter += letterArray[b - 1];
			return letter;
		} else {
			return letterArray[num - 1];
		}
	}

	//读取配置文件中的报表模板的存储URL
	public static String readProperties() {
		Properties prop = new Properties();
		//读取属性文件a.properties
		try {
			InputStream in = CommonUtil.class.getResourceAsStream("/upload.properties");
			prop.load(in); ///加载属性列表
			in.close();
			return prop.getProperty("cellUploadUrl");
		} catch (Exception e) {
			System.out.println(e);
			return null;
		}
	}

	/**
	 * 判断传入对象是否为空
	 * 
	 * @param obj 需要判断的是对象
	 */
	public static boolean isNullOrEmpty(Object obj) {
		if (obj == null) {
			return true;
		} else {
			return false;
		}
	}
}